package com.bckj.fastboot.core.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Set;

public interface MapOp {

    default void put(String key, Object value) { }
    default Object get(String key) {
        return null;
    }
    default boolean containsKey(String key) {
        return false;
    }
    default Set<String> keySet() {
        return Set.of();
    }

    default String getString(String key) {
        return getString(key, null);
    }

    default String getString(String key, String defaultValue) {
        Object value = get(key);
        return value == null ? defaultValue : value.toString();
    }

    default Integer getInteger(String key) {
        return getInteger(key, null);
    }

    default Integer getInteger(String key, Integer defaultValue) {
        Number number = getNumber(key);
        return number == null ? defaultValue : number.intValue();
    }

    default Long getLong(String key) {
        return getLong(key, null);
    }

    default Long getLong(String key, Long defaultValue) {
        Number number = getNumber(key);
        return number == null ? defaultValue : number.longValue();
    }

    default Float getFloat(String key) {
        return getFloat(key, null);
    }

    default Float getFloat(String key, Float defaultValue) {
        Number number = getNumber(key);
        return number == null ? defaultValue : number.floatValue();
    }

    default Double getDouble(String key) {
        return getDouble(key, null);
    }

    default Double getDouble(String key, Double defaultValue) {
        Number number = getNumber(key);
        return number == null ? defaultValue : number.doubleValue();
    }

    default Boolean getBoolean(String key) {
        return getBoolean(key, null);
    }

    default Boolean getBoolean(String key, Boolean defaultValue) {
        Object answer = get(key);
        Boolean booleanValue = ConvertUtils.parseBoolean(answer);
        return booleanValue == null ? defaultValue : booleanValue;
    }

    default Number getNumber(String key) {
        Object answer = get(key);
        return ConvertUtils.parseNumber(answer);
    }

    default LocalDateTime getLocalDateTime(String key) {
        return ConvertUtils.parseLocalDateTime(get(key));
    }

    default LocalDate getLocalDate(String key) {
        return ConvertUtils.parseLocalDate(get(key));
    }

    default LocalTime getLocalTime(String key) {
        return ConvertUtils.parseLocalTime(get(key));
    }
}
